package wikist.service;

import org.slim3.datastore.Datastore;

import wikist.meta.StoreFormatPageContentMeta;
import wikist.model.StoreFormatPageContent;

import com.google.appengine.api.datastore.Transaction;

/**
 * Wikiページの登録内容の管理を行うサービス
 * 
 * @author onjiro.mohyahya
 */
public class PageContentsManagementService {

    /**
     * URLに関連付けられたコンテンツの取得
     * 
     * @param pageUrl
     * @return
     */
    public PageContent get(String pageUrl) {
        StoreFormatPageContentMeta meta = StoreFormatPageContentMeta.get();
        StoreFormatPageContent page =
            Datastore.query(meta).filter(meta.url.equal(pageUrl)).asSingle();
        return new PageContent(page);
    }

    /**
     * URLにコンテンツを関連付けて登録
     * 
     * @param url
     * @param title
     * @param content
     */
    public void entry(String url, String title, StringInWikiNotation content) {
        StoreFormatPageContent entity = new StoreFormatPageContent();

        // すでに同じURLで登録が存在する場合は上書きする。
        PageContent currentEntitiy = this.get(url);
        if (!currentEntitiy.isNewPage()) {
            entity.setKey(currentEntitiy.storedData.getKey());
        }
        entity.setUrl(url);
        entity.setTitle(title);
        entity.setContent(content.getContent());

        Transaction trx = Datastore.beginTransaction();
        Datastore.put(entity);
        trx.commit();
    }

    public static final class PageContent {
        private StoreFormatPageContent storedData;

        private PageContent(StoreFormatPageContent storedData) {
            this.storedData = storedData;
        }

        public boolean isNewPage() {
            return this.storedData == null;
        }

        public String getTitle() {
            return this.storedData.getTitle();
        }

        public StringInWikiNotation getContentInWiki() {
            return new StringInWikiNotation(this.storedData.getContent());
        }

        public StringInHtmlNotation getContentInHtml() {
            return WikiNotationCompileService
                .complileInHtml(new StringInWikiNotation(this.storedData
                    .getContent()));
        }

    }
}
